package com.tbvtc.agriculturalcreditchainserver2025.utils;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 库尔勒香梨生长环境评分计算器
 * 基于日均温度、温差、湿度和光照计算环境适宜度得分（0-100分）
 */
@Component
public class PearEnvironmentScorer {
    
    // 各参数权重配置（总和为100%）
    private static final double DIFFERENCE_WEIGHT = 0.3;   // 温差权重（30%，库尔勒香梨对温差敏感）
    private static final double TEMPERATURE_WEIGHT = 0.25; // 日均温度权重（25%）
    private static final double HUMIDITY_WEIGHT = 0.2;     // 湿度权重（20%）
    private static final double ILLUMINATION_WEIGHT = 0.25;// 光照权重（25%）
    
    /**
     * 计算综合得分
     * @return 环境适宜度得分（0-100分，保留一位小数）
     */
    public double calculateScore(Double temperatureDifference,Double illumination,
    Double temperature,Double humidity) {
        // 验证参数有效性
        validateParameters(temperatureDifference, illumination, temperature, humidity);
        
        // 计算各项得分
        double diffScore = calculateTemperatureDifferenceScore(temperatureDifference);
        double tempScore = calculateTemperatureScore(temperature);
        double humidityScore = calculateHumidityScore(humidity);
        double illuminationScore = calculateIlluminationScore(illumination);
        
        // 计算综合得分（加权求和）
        double totalScore = diffScore * DIFFERENCE_WEIGHT 
                          + tempScore * TEMPERATURE_WEIGHT 
                          + humidityScore * HUMIDITY_WEIGHT 
                          + illuminationScore * ILLUMINATION_WEIGHT;
        
        // 保留一位小数
        return new BigDecimal(totalScore).setScale(1, RoundingMode.HALF_UP).doubleValue();
    }
    
    /**
     * 计算温差得分（0-100分）
     * 库尔勒香梨适宜较大温差，最佳12-15℃，最低不低于8℃
     */
    private double calculateTemperatureDifferenceScore(double difference) {
        if (difference >= 15) {
            return 100; // 理想温差
        } else if (difference >= 12) {
            return 90 + (difference - 12) * 3.33; // 12℃得90分，每增加1℃加3.33分
        } else if (difference >= 10) {
            return 70 + (difference - 10) * 10; // 10℃得70分，每增加1℃加10分
        } else if (difference >= 8) {
            return 40 + (difference - 8) * 15; // 8℃得40分，每增加1℃加15分
        } else if (difference >= 5) {
            return 10 + (difference - 5) * 10; // 5℃得10分，每增加1℃加10分
        } else {
            return Math.max(0, difference * 2); // 5℃以下，每℃得2分，最低0分
        }
    }
    
    /**
     * 计算日均温度得分（0-100分）
     * 综合考虑各生长阶段，适宜范围15-25℃
     */
    private double calculateTemperatureScore(double temp) {
        if (temp >= 20 && temp <= 25) {
            return 100; // 最适宜温度
        } else if (temp >= 15 && temp < 20) {
            return 70 + (temp - 15) * 6; // 15℃得70分，每增加1℃加6分
        } else if (temp > 25 && temp <= 30) {
            return 90 - (temp - 25) * 2; // 25℃得90分，每增加1℃减2分
        } else if (temp >= 10 && temp < 15) {
            return 40 + (temp - 10) * 6; // 10℃得40分，每增加1℃加6分
        } else if (temp > 30 && temp <= 35) {
            return 60 - (temp - 30) * 6; // 30℃得60分，每增加1℃减6分
        } else {
            return 0; // 低于10℃或高于35℃不适宜
        }
    }
    
    /**
     * 计算湿度得分（0-100分）
     * 适宜范围50%-70%
     */
    private double calculateHumidityScore(double humidity) {
        if (humidity >= 50 && humidity <= 70) {
            return 100; // 适宜湿度
        } else if (humidity > 70 && humidity <= 80) {
            return 90 - (humidity - 70) * 3; // 70%得90分，每增加1%减3分
        } else if (humidity < 50 && humidity >= 40) {
            return 80 - (50 - humidity) * 2; // 50%得80分，每减少1%减2分
        } else if (humidity > 80 && humidity <= 90) {
            return 60 - (humidity - 80) * 3; // 80%得60分，每增加1%减3分
        } else if (humidity < 40 && humidity >= 30) {
            return 50 - (40 - humidity) * 2; // 40%得50分，每减少1%减2分
        } else {
            return 0; // 高于90%或低于30%不适宜
        }
    }

    /**
     * 计算光照得分（0-100分）
     * 适宜范围800-2000 lux
     */
    private double calculateIlluminationScore(double illumination) {
        if (illumination >= 800 && illumination <= 2000) {
            return 100; // 适宜光照，得满分
        } else if (illumination > 2000 && illumination <= 3000) {
            // 2000得90分，每增加200lux减1分，直到3000得40分
            return 90 - (illumination - 2000) / 200;
        } else if (illumination < 800 && illumination >= 300) {
            // 300得60分，每增加50lux加1分，直到800得70分
            return 60 + (illumination - 300) / 50;
        } else if (illumination > 3000 && illumination <= 4000) {
            // 3000得40分，每增加200lux减1分，直到4000得-10分，取0分下限
            double score = 40 - (illumination - 3000) / 200;
            return Math.max(score, 0);
        } else {
            return 0; // 低于300lux或高于4000lux不适宜
        }
    }

    
    /**
     * 参数验证
     */
    private void validateParameters(Double... params) {
        for (Double param : params) {
            if (param == null || param < 0) {
                throw new IllegalArgumentException("环境参数不能为null或负数");
            }
        }
    }
    


}
